Use g_once for all the mkenums template files
authorFederico Mena Quintero <federico@gnome.org>
Tue, 21 May 2019 15:32:08 +0000 (10:32 -0500)
committerFederico Mena Quintero <federico@gnome.org>
Tue, 21 May 2019 15:32:08 +0000 (10:32 -0500)
Without this, initialization of enum/flags values from multithreaded
programs may not work correctly.

Fixes #1617.

gdk/gdkenumtypes.c.template
gtk/gtkprivatetypebuiltins.c.template
gtk/gtktypebuiltins.c.template

index 5237d549ab411e9dbaa3abf3ba42269300035e57..c5104e0e0d8692ea6ddd4861657738c7e8ac211e 100644 (file)
 GType
 @enum_name@_get_type (void)
 {
-    static GType etype = 0;
-    if (G_UNLIKELY(etype == 0)) {
-        static const G@Type@Value values[] = {
+  static volatile gsize g_define_type_id__volatile = 0;
+
+  if (g_once_init_enter (&g_define_type_id__volatile))
+    {
+      static const G@Type@Value values[] = {
 /*** END value-header ***/
 
 /*** BEGIN value-production ***/
-            { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+        { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
 /*** END value-production ***/
 
 /*** BEGIN value-tail ***/
-            { 0, NULL, NULL }
-        };
-        etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+        { 0, NULL, NULL }
+      };
+      GType g_define_type_id =
+        g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
     }
-    return etype;
+
+  return g_define_type_id__volatile;
 }
 
 /*** END value-tail ***/
index 44af1bc9dd4ed19e5e4b620270693eb8080158de..d7961be8ef05439832e8a9a855c6934521caf6df 100644 (file)
 GType
 _@enum_name@_get_type (void)
 {
-    static GType etype = 0;
-    if (G_UNLIKELY(etype == 0)) {
-        static const G@Type@Value values[] = {
+  static volatile gsize g_define_type_id__volatile = 0;
+
+  if (g_once_init_enter (&g_define_type_id__volatile))
+    {
+      static const G@Type@Value values[] = {
 /*** END value-header ***/
 
 /*** BEGIN value-production ***/
-            { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+        { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
 /*** END value-production ***/
 
 /*** BEGIN value-tail ***/
-            { 0, NULL, NULL }
-        };
-        etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+        { 0, NULL, NULL }
+      };
+      GType g_define_type_id =
+        g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
     }
-    return etype;
+
+  return g_define_type_id__volatile;
 }
 
 /*** END value-tail ***/
index 38aaaccbd6cba1e7f0ae1565c1cb5bbe653ddbe0..9a5a360f0961b59966a3b7de20208f43ca443eb4 100644 (file)
 GType
 @enum_name@_get_type (void)
 {
-    static GType etype = 0;
-    if (G_UNLIKELY(etype == 0)) {
-        static const G@Type@Value values[] = {
+  static volatile gsize g_define_type_id__volatile = 0;
+
+  if (g_once_init_enter (&g_define_type_id__volatile))
+    {
+      static const G@Type@Value values[] = {
 /*** END value-header ***/
 
 /*** BEGIN value-production ***/
-            { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+        { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
 /*** END value-production ***/
 
 /*** BEGIN value-tail ***/
-            { 0, NULL, NULL }
-        };
-        etype = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+        { 0, NULL, NULL }
+      };
+      GType g_define_type_id =
+        g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
+      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
     }
-    return etype;
+
+  return g_define_type_id__volatile;
 }
 
 /*** END value-tail ***/